#include "tcp_handler.h"


int create_server(const char *ip, unsigned short port)
{
    // 1. socket() 获取服务器套接字
    // AF_INET      ipv4协议
    // SOCK_STREAM  TCP协议
    // ０           根据前两个参数自动选择
    int server_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == server_fd)
    {
        ERROR("socket");
        return -1;
    }

    // 2. 输入网络信息结构体
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;               // ipv4 协议
    server_addr.sin_port = htons(port);             // 端口号
    if(0 == inet_aton(ip, &server_addr.sin_addr))    // ip地址
    {
        ERROR("inet_aton");
        close(server_fd);
        return -1;
    }

    // 允许端口复用
    int reuseport = 1;
    if(-1 == setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &reuseport, sizeof(reuseport)))
    {
        ERROR("setsockopt");
        return -1;
    }

    // 3. bind() 将服务器的ip地址和端口号绑定到套接字中。
    if(-1 == bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
        ERROR("bind");
        close(server_fd);
        return -1;
    }
    // 4. listen() 将主动套接字设置为被动监听模式，　并设置最多监听连接队列长度
    if(-1 == listen(server_fd, MAX_CLIENTS))
    {
        ERROR("listen");
        close(server_fd);
        return -1;
    }

    // 5. 返回设置好的服务器套接字
    return server_fd;
}



// 获取客户端套接字
int create_client(const char *ip, unsigned short port)
{
    // 1. socket() 获取客户端套接字
    // AF_INET      ipv4协议
    // SOCK_STREAM  TCP协议
    // ０           根据前两个参数自动选择
    int client_fd = socket(AF_INET, SOCK_STREAM, 0);
    if(-1 == client_fd)
    {
        ERROR("socket");
        return -1;
    }

    // 2. 输入网络信息结构体
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;               // ipv4 协议
    server_addr.sin_port = htons(port);             // 端口号
    if(0 == inet_aton(ip, &server_addr.sin_addr))    // ip地址
    {
        ERROR("inet_aton");
        close(client_fd);
        return -1;
    }

    // 3. 连接到服务器
    if(-1 == connect(client_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)))
    {
        ERROR("connect");
        close(client_fd);
        return -1;
    }

    // 4. 返回连接成功的客户端套接字
    return client_fd;
}